/**
 * @fileOverview The "typograph" plugin.
 */
(function(){

VED.plugins.add( 'typograph', {
   lang: 'en,ru', // %REMOVE_LINE_CORE%
   icons: 'typograph', // %REMOVE_LINE_CORE%
   hidpi: true, // %REMOVE_LINE_CORE%
   init: function( editor ) {
      editor.addCommand( 'Typograph', VED.plugins.typograph.commands.typograph );
      editor.ui.addButton && editor.ui.addButton( 'Typograph', {
         label: editor.lang.typograph.toolbar,
         command: 'Typograph',
         toolbar: 'cleanup,10'
      });
   }
});

VED.plugins.typograph = {
   commands: {
      typograph: {
         exec: function( editor ) {
            // Запускаем типограф
            var data = editor.getData();
            editor.setData( TU_typograf( data, editor.config.typographLang != 'ru' ) );
         }
      }
   }

};


// Какой-то Рос-Нановский типограф
function TU_typograf(text, englishVersion) {
	if (typeof(englishVersion) == 'undefined') {
		englishVersion = false;
	}

	var text = ' ' + text;

	// сохраняем теги
	var i = 0;
	var storedTags = text.match(/<([^>]*)>/g)
	var tagSearch = /<([^>]*)>/;
	while (tagSearch.test(text)) {
		text = text.replace(tagSearch, '\x01' + i + '\x02');
		i++;
	}

	// сбрасываем кавычки и другие символы в дефолтные варианты

	text = text.replace(/([А-Яа-яA-Za-z])(‘|’|&apos;|&lsquo;|&rsquo;)([А-Яа-яA-Za-z\s])/g, "$1'$3");
	text = text.replace(/[«»“”„‘’]/g, '"');
	text = text.replace(/…/g, '...');
	text = text.replace(/[–—]/g, '-');
	text = text.replace(/&(#151|#150|mdash|ndash|minus);/gi, '-');
	text = text.replace(/&(quot|laquo|raquo|bdquo|rdquo|ldquo|#147|#148|#132|#145|#146);/gi, '"');
	text = text.replace(/&nbsp;/gi, ' ');

	// если после открывающей скобки или кавычки одна буква или цифра, то должен ставиться неразрывный пробел.
	text = text.replace(/(\(|\[|"|')([0-9А-Яа-яA-Za-z])\s/g, '$1$2&nbsp;');

	// обработка кавычек
	if (englishVersion) {
		text = text.replace(/([\x01-(\s\"])(\")([^\"]{1,})([^\s\"(])(\")/g, '$1“$3$4”');
		// обрабатываем вложенные кавычки
		if (/"/.test(text)) {
			text = text.replace(/([\x01(\s\"])(\")([^\"]{1,})([^\s\"(])(\")/g, '$1“$3$4”');
			while (/(“)([^”]*)(“)/.test(text)) {
				text = text.replace(/(“)([^”]*)(“)([^”]*)(”)/g, '$1$2‘$4’');
			}
		}
	} else {
		text = text.replace(/([\x01-(\s\"])(\")([^\"]{1,})([^\s\"(])(\")/g, '$1«$3$4»');
		// обрабатываем вложенные кавычки
		if (/"/.test(text)) {
			text = text.replace(/([\x01(\s\"])(\")([^\"]{1,})([^\s\"(])(\")/g, '$1«$3$4»');
			while (/(«)([^»]*)(«)/.test(text)) {
				text = text.replace(/(«)([^»]*)(«)([^»]*)(»)/g, '$1$2„$4”');
			}
		}
	}

	text = text.replace(/  +/g, ' ');
	text = text.replace(/«/g, '&laquo;');
	text = text.replace(/»/g, '&raquo;');

	text = text.replace(/„/g, '&bdquo;');
	text = text.replace(/”/g, '&rdquo;');
	text = text.replace(/“/g, '&ldquo;');

	text = text.replace(/‘/g, '&lsquo;');
	text = text.replace(/’/g, '&rsquo;');

	text = text.replace(/ -{1,2} /g, '&nbsp;&mdash; ');
	text = text.replace(/\.{3}/g, '&#133;');
	text = text.replace(/([>|\s])- /g, '$1&mdash; ');
	text = text.replace(/^- /g, '&mdash; ');

	text = text.replace (/(\d)-(\d)/g, '$1&ndash;$2');
	text = text.replace (/([А-Яа-яA-Za-z\.]+)-([А-Яа-яA-Za-z\.]+)/g, '<nobr>$1-$2</nobr>');
	text = text.replace (/(\d)\s/g, '$1&nbsp;');

	text = text.replace(/([А-Яа-яA-Za-z]) (ли|ль|же|ж|бы|б|тыс|млн|млрд|руб)([^А-Яа-яA-Za-z])/gi, '$1&nbsp;$2$3');
	text = text.replace(/(\s)([А-Яа-я]{1})\s/g, '$1$2&nbsp;');

	// Если подряд идет несколько однобуквенных союзов или предлогов, то после них
	// всех должны идти неразрывные пробелы. а не только после первого.
	text = text.replace(/([^А-Яа-яA-Za-z0-9])([А-Яа-яA-Za-z])\s/g, '$1$2&nbsp;');

	// инициалы
	// A.C. Пушкин
	text = text.replace(/([А-ЯA-Z])([\. ]{1})[ ]{0,1}([А-ЯA-Z])([\. ]{1})[ ]{0,1}([А-ЯA-Z][А-Яа-яA-Za-z]*)/g, '$1.&nbsp;$3.&nbsp;$5');

	// Пушкин А. С.
	text = text.replace(/([А-ЯA-Z][А-Яа-яA-Za-z]*) ([А-ЯA-Z])\.[ ]?([А-ЯA-Z])\./g, '$1&nbsp;$2.&nbsp;$3.'); // Переписал эту дрянь

	// сокращения типа ул.
	text = text.replace(/((\s|&nbsp;)[а-я]{1,2})\.\s/g, '$1.&nbsp;'); //*** Добавил &nbsp; в начале

	text = text.replace(/'/g, '&rsquo;');
	text = text.replace(/\(c\)/gi, '&copy;');
	text = text.replace(/\(r\)/gi, '&reg;');
	text = text.replace(/\(tm\)/gi, '&trade;');
	text = text.replace(/№ /gi, '&#8470;&nbsp;');
	text = text.replace(/№/gi, '&#8470;');

	// восстанавливаем теги
	i = 0;
	tagSearch = /\x01([0-9]*)\x02/;
	while (tagSearch.test(text)) {
		text = text.replace(tagSearch, storedTags[i]);
		i++;
	}

	// очищаем дублирующиеся <nobr>
	text = text.replace(/(<nobr>)+/gi, '<nobr>');
	text = text.replace(/(<\/nobr>)+/gi, '</nobr>');
	text = text.substr(1, text.length-1);

	return text;
}

VED.config.typographLang = 'ru';


})();